import axios from 'axios'
import nprogress from 'nprogress'
import 'nprogress/nprogress.css'
import { ElMessage } from 'element-plus'
import { getToken, removeToken } from '@/utils/setToken'
import router from '@/router'

const baseURL = import.meta.env.VITE_API_BASE_URL || '/api'

// 创建axios实例
const service = axios.create({
  baseURL,
  // 后端推理可能耗时较长，适当放宽超时时间避免误判
  timeout: 60000,
  headers: {
    'Content-Type': 'application/json;charset=UTF-8'
  },
  withCredentials: true
})

// 请求拦截器
service.interceptors.request.use(
  (config) => {
    nprogress.start()

    const token = getToken()
    if (token) {
      config.headers.Authorization = token
    }

    return config
  },
  (error) => {
    nprogress.done()
    return Promise.reject(error)
  }
)

//响应拦截器
service.interceptors.response.use(
  (response) => {
    nprogress.done()
    return handleResponse(response)
  },
  (error) => {
    nprogress.done()
    return handleError(error)
  }
)

// 响应处理函数
function handleResponse(response) {
  const { status, data } = response

  switch (status) {
    case 200: // 正常响应
    case 201: // 创建成功
    case 204: // 删除成功
      return data
    default:
      const errorMsg = data?.message || `未知响应状态: ${status}`
      return Promise.reject(new Error(errorMsg))
  }
}

// 错误处理函数
function handleError(error) {
  // HTTP 状态码错误处理
  if (error.response) {
    const { status, data } = error.response
    const statusMap = {
      400: { message: data?.detail || '请求参数错误', handler: null },
      401: { message: '未登录，请重新登录', handler: clearAuth },
      403: { message: '登录失效，请重新登录', handler: clearAuth },
      404: { message: '未找到资源', handler: null },
      500: { message: data?.detail || '服务器内部错误', handler: null }
    }

    const currentStatus =
      statusMap[status] || {
        message: data?.detail || `网络错误 (${status})`,
        handler: null
      }

    // 执行对应的处理逻辑
    if (currentStatus.handler) {
      currentStatus.handler()
    }

    // 显示错误提示
    ElMessage({
      message: currentStatus.message,
      type: 'error',
      duration: 3000
    })

    return Promise.reject(new Error(currentStatus.message))
  }

  // 非HTTP错误处理（网络错误/超时）
  const message = error.message.includes('timeout')
    ? '请求超时，请检查网络连接'
    : '网络连接异常，请检查网络'

  ElMessage({
    message,
    type: 'error',
    duration: 3000
  })

  return Promise.reject(error)
}

// 认证清除函数
function clearAuth() {
  removeToken()
  // 路由跳转逻辑
  router.replace('/login')
}

export default service
